package com.cmc.cloud.cmclink.doc.service.so;

import com.cmc.cloud.cmclink.doc.api.document.req.so.BookingConfirmationDataDto;
import com.cmc.cloud.cmclink.doc.api.document.req.soamendapplyvo.SoAmendApplyUpdateReqVO;
import com.cmc.cloud.cmclink.doc.entity.SoDO;
import com.cmc.cloud.cmclink.doc.vo.CodCheckReqVO;
import com.cmc.cloud.cmclink.doc.vo.manifestvo.manifest.ManifestSoPageReqVO;
import com.cmc.cloud.cmclink.doc.vo.sovo.sovo.*;
import com.cmc.cloud.cmclink.doc.vo.sovo.sovslvoyvo.SoVslvoyScheduleVO;
import com.cmc.cloud.cmclink.doc.vo.sovo.sovslvoyvo.SoVslvoyUpdateReqVO;
import com.cmc.cloud.cmclink.svl.api.base.req.PolPodReqDTO;
import com.cmes.framework.common.pojo.CommonResult;
import com.cmes.framework.common.pojo.PageResult;
import io.swagger.v3.oas.annotations.Operation;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;

import javax.servlet.http.HttpServletResponse;
import java.util.Collection;
import java.util.List;

/**
 * @author 陈正
 * @date 2025/7/22
 */
public interface BizSoService {


    /**
     * 通过订舱Ids 删除
     *
     * @param ids    订舱Ids
     * @param userId 用户ID
     */
    void batchDeleteDraft(List<Long> ids, String userId);

    /**
     * 订舱打印
     *
     * @param response 订舱Ids
     * @param soId     订舱ID
     */
    void bookingComfirmPrint(HttpServletResponse response, Long soId);

    /**
     * 订舱确认书
     *
     * @param soId
     * @return 地址
     */
    FileUploadRespVo bookingComfirmPrintAddress(Long soId);

    /**
     * 订舱确认通知书数据组装
     *
     * @param soId soId
     * @return 订舱确认通知书打印数据
     */
    BookingConfirmationDataDto getBookingConfirmData(Long soId);



    /**
     * 列表分页查询
     *
     * @param pageVO 查询条件
     * @return 查询分页
     */
    PageResult<SoRespVO> getSoPage(SoPageReqVO pageVO);

    /**
     * 列表分页查询
     *
     * @param pageVO 查询条件
     * @return 查询分页
     */
    PageResult<SoRespVO> getSoManifest(ManifestSoPageReqVO pageVO);

    /**
     * 列表分页查询
     *
     * @param pageVO  查询条件
     * @param approve 是否批舱
     * @return 查询分页
     */
    PageResult<SoRespVO> getSoPage(SoPageReqVO pageVO, boolean approve);

    /**
     * 列表分页查询
     *
     * @param pageVO 查询条件
     * @return 查询分页
     */
    PageResult<SoRespVO> getSoPageAmend(SoPageReqVO pageVO);

    /**
     * 通过订舱Ids  修改，新增
     *
     * @param createReqVO 订舱数据
     * @param update      新增 false ，修改 true
     * @param userId      用户ID
     * @return id
     */
    Long createOrUpdateSo(SoCreateAndUpdateReqVo createReqVO, boolean update, String userId);

    /**
     * 新增 并提交
     *
     * @param createReqVO 订舱数据
     * @param userId      用户ID
     * @return id
     */
    Long createAndSubmit(SoCreateAndUpdateReqVo createReqVO, String userId);

    /**
     * 通过订舱Id 查看详情
     *
     * @param id 订舱Id
     * @return 结果
     */
    SoDetailRespVO getDetail(Long id);

    /**
     * 兼容网厅RPC
     *
     * @param id               订舱Id
     * @param userId           用户ID
     * @param needPreviousNext 是否需要上一条下一条
     * @return SoDetailRespVO
     */
    SoDetailRespVO getDetail(Long id, String userId, boolean needPreviousNext);

    /**
     * 通过提单号列表 查看SO详情
     *
     * @param blNos 提单号列表
     * @return so详情列表
     */
    List<SoDetailRespVO> getSoDetailListByBlNos(List<String> blNos);


    /**
     * 通过订舱Id 查看详情列表
     *
     * @param ids 订舱Id
     * @return 结果
     */
    List<SoDetailRespVO> getDetailList(List<Long> ids);

    /**
     * 批量复制
     *
     * @param ids    订舱Id
     * @param userId 用户ID
     */
    void batchCopy(List<Long> ids, String userId);

    /**
     * 复制详情
     *
     * @param id         订舱Id
     * @param userId     用户ID
     * @param needInsert 是否入库
     * @return 复制详情
     */
    SoCopyDetailRespVo copyDetail(Long id, String userId, boolean needInsert);

    /**
     * 订舱草稿批量提交
     *
     * @param ids    订舱ids批量提交
     * @param userId 用户ID
     */
    void batchSubmitDraft(List<Long> ids, String userId);

    /**
     * 状态是【订舱处理中】的 SO 记录才允许批量返回草稿
     *
     * @param ids    订舱ids批量提交
     * @param userId 用户ID
     */
    void batchReturnToDraft(Collection<Long> ids, String userId);

    /**
     * 【订舱处理中】、【订舱舱位确认中】、【订舱待补充材料】的 SO 记录才允许批量取消订舱。
     * 取消提交成功后状态更新为【客户取消订舱】
     *
     * @param ids    订舱ids批量提交
     * @param userId 用户ID
     * @return 通用响应对象
     */
    CommonResult<Void> batchCancelBooking(Collection<Long> ids, String userId);

    /**
     * 批量修改订舱的船名航次
     *
     * @param updateReqVO 航次
     * @param userId      用户ID
     *
     */
    void batchChangeBkgVessel(SoVslvoyUpdateReqVO updateReqVO, String userId);

    /**
     * 批量修改订舱内容状态
     *
     * @param ids             航次
     * @param reasonType      理由类型
     * @param descCn          理由详细
     * @param soContentStatus 状态
     * @param userId          状态
     */
    void changeSoContentStatus(Collection<Long> ids, String reasonType, String descCn, String soContentStatus, String userId);

    /**
     * 通过订舱Id 查看详情
     *
     * @param req 订舱
     * @return 结果
     */
    SoDetailRespVO getByBookingNoOrBlNo(SoQueryReqVO req);

    /**
     * 校验BCR
     *
     * @param soId 订舱id
     * @return 明细
     */
    SoDetailRespVO checkSoBcr(Long soId);

    /**
     * 批量修改订舱内容状态
     *
     * @param ids        航次
     * @param reasonType 理由类型
     * @param descCn     理由详细
     * @param userId     状态
     */
    void awaitingMaterialUploaded(Collection<Long> ids, String reasonType, String descCn, String userId);

    /**
     * 通过订舱Ids  修改，新增
     *
     * @param createReqVO 订舱数据
     * @param userId      用户ID
     * @return id
     */
    Long updateConfirmedSoAmend(SoCreateAndUpdateReqVo createReqVO, String userId);

    /**
     * 通过订舱Ids  修改，新增 检查
     *
     * @param soId   订舱数据
     * @param userId 用户ID
     */
    void updateConfirmedSoAmendCheck(Long soId, String userId);

    /**
     * 通过订舱Ids  修改，新增
     *
     * @param createReqVO 订舱数据
     * @param userId      用户ID
     * @return id
     */
    void cancelSoAmend(SoCancelReqVo createReqVO, String userId);

    /**
     * 通过订舱Ids  修改，新增
     *
     * @param createReqVO 订舱数据
     * @param userId      用户ID
     * @return id
     */
    Long updateConfirmedSoAmendVessel(SoCreateAndUpdateReqVo createReqVO, String userId);

    /**
     * 通过订舱Ids  修改，新增
     *
     * @param amendApply 审批
     * @param userId     用户ID
     */
    void updateConfirmedSoAudit(SoAmendApplyUpdateReqVO amendApply, String userId);

    /**
     * 取消申请
     *
     * @param amendApplyId 审批
     * @param userId       用户ID
     */
    void amendCancel(Long amendApplyId, String userId);

    /**
     * 通过订舱Ids  取消
     *
     * @param amendApply 审批
     * @param userId     用户ID
     */
    void cancelSoAudit(SoAmendApplyUpdateReqVO amendApply, String userId);

    /**
     * 通过申请ID查看
     *
     * @param amendApplyId 审批
     * @return 对比详情
     */
    SoDetailCompareRespVo getAmendApplyDetail(Long amendApplyId);

    /**
     * 获取船期数据
     *
     * @param polPodReq 港口数据
     * @return 船期数据
     */
    List<SoVslvoyScheduleVO> getLineScheduleByPolPod(PolPodReqDTO polPodReq);


    /**
     * 获得航次截止时间
     *
     * @param vesselCode 船舶编码
     * @param voyage     航次
     * @param polCode    POL
     * @param timeType   类型
     */
    void checkVoyageBookingTime(String vesselCode, String voyage, String polCode, String timeType);

    /**
     * 获得订单号
     *
     * @param so 订舱信息
     */
    void getBookingNoAndBlNoBySo(SoDO so);

    /**
     * COD校验
     *
     * @param reqVO COD校验请求参数
     * @return 如果当前时间小于截止时间返回true，否则返回false
     */
    boolean checkCodTime(CodCheckReqVO reqVO);

    /**
     * 查询
     *
     * @param reqVO 查询
     * @return 列表
     */
    List<SoRespVO> queryList(SoListReqVO reqVO);


    /**
     * 船期数据校验
     * @param soVslvoyList 船期数据
     */
    void checkVslvoy(List<SoVslvoyUpdateReqVO> soVslvoyList);

}
